All files / core/snap/indexes KeyIndex.ts

88.89% Statements 24/27
100% Branches 0/0
70% Functions 7/10
88% Lines 22/25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96                                15x 15x 15x 15x         15x 15x         15x           15x 62x           15x                 15x             15x 4x           15x     6x               15x 2x         2x           15x 46x   15x   15x  
/**
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import { Index } from './Index';
import { Node, NamedNode } from '../Node';
import { nameCompare, MAX_NAME } from '../../util/util';
import { assert, assertionError } from '@firebase/util';
import { ChildrenNode } from '../ChildrenNode';
 
let __EMPTY_NODE: ChildrenNode;
 
export class KeyIndex extends Index {
  static get __EMPTY_NODE() {
    return __EMPTY_NODE;
  }
 
  static set __EMPTY_NODE(val) {
    __EMPTY_NODE = val;
  }
 
  /**
   * @inheritDoc
   */
  compare(a: NamedNode, b: NamedNode): number {
    return nameCompare(a.name, b.name);
  }
 
  /**
   * @inheritDoc
   */
  isDefinedOn(node: Node): boolean {
    // We could probably return true here (since every node has a key), but it's never called
    // so just leaving unimplemented for now.
    throw assertionError('KeyIndex.isDefinedOn not expected to be called.');
  }
 
  /**
   * @inheritDoc
   */
  indexedValueChanged(oldNode: Node, newNode: Node): boolean {
    return false; // The key for a node never changes.
  }
 
  /**
   * @inheritDoc
   */
  minPost() {
    return (NamedNode as any).MIN;
  }
 
  /**
   * @inheritDoc
   */
  maxPost(): NamedNode {
    // TODO: This should really be created once and cached in a static property, but
    // NamedNode isn't defined yet, so I can't use it in a static.  Bleh.
    return new NamedNode(MAX_NAME, __EMPTY_NODE);
  }
 
  /**
   * @param {*} indexValue
   * @param {string} name
   * @return {!NamedNode}
   */
  makePost(indexValue: string, name: string): NamedNode {
    assert(
      typeof indexValue === 'string',
      'KeyIndex indexValue must always be a string.'
    );
    // We just use empty node, but it'll never be compared, since our comparator only looks at name.
    return new NamedNode(indexValue, __EMPTY_NODE);
  }
 
  /**
   * @return {!string} String representation for inclusion in a query spec
   */
  toString(): string {
    return '.key';
  }
}
 
export const KEY_INDEX = new KeyIndex();